13.2.3 运行容器
现在,我们来看一下容器的运行情况。在很多方面,运行容器与运行单个进程没有什么不同,但是Docker的引入可能会带来自身的挑战,并且Docker带来的行为更改也可能迫使你考虑基础架构的其他方面。
1.操作系统
在运行Docker平台时,你运行的操作系统可能会变得很重要。企业操作系统可能还不是最新最好的内核版本,正如你将在第16章中看到的那样,正在运行的内核版本对于你的应用程序而言可能非常重要。
从历史上看,Docker一直是一个发展迅速的代码库,并非所有经过精心挑选的操作系统都能跟上(1.10的过渡对我们来说是特别痛苦的事情,对镜像的存储格式进行了重大更改)。在向供应商保证他们的应用程序将在你的Kubernetes集群上运行之前,检查一下包管理器中可以使用哪些版本的Docker(以及相关技术,例如Kubernetes)是值得的。
2.共享存储
用户开始部署应用程序后,他们首先要关注的是数据的去向。Docker的核心是使用独立于正在运行的容器的卷(见第5章)。
这些卷可以由本地或远程挂载的多种存储支持,但是关键是该存储可以由多个容器共享,这使其非常适合运行在各个容器周期内持久存在的数据库。
- 共享存储易于提供吗? 共享存储的维护和提供成本可能很高,无论是所需的基础架构还是时间成本。在许多组织中,提供存储并不是调用API并等待几秒(比如使用AWS之类的云提供商的服务)那么简单。
- 对共享存储的支持是否已准备就绪,可以满足不断增长的需求? 由于部署Docker容器和新环境进行开发或测试非常容易,因此对共享存储的需求会急剧增加。要考虑你是否已准备好了。
- 共享存储可在不同部署地点使用吗? 你可能有多个数据中心或云提供商,甚至是两者的混合。所有这些位置都可以无缝对话吗?他们必须这样做还是他们不能这样做?监管约束以及对开发人员开启系统能力的需求都需要你做一些工作。
3.网络
关于网络,在实现Docker平台时可能需要考虑一些事项。
如第10章所示,默认情况下,每个Docker容器都有一个自己的IP地址,该IP地址是由一组保留的IP地址分配的。如果你要引入一种产品来管理网络上容器的运行,则可能会保留其他网络地址集。例如,Kubernetes的服务层使用一组网络地址来维护并路由到其节点集群中的稳定端点。
一些组织出于自己的目的保留IP范围,因此你需要小心有冲突。例如,如果为一组特定的数据库保留了IP地址范围,则使用集群中的IP范围作为其容器或服务的应用程序可能会接管这些IP,并阻止集群中的其他应用程序访问该组数据库。用于这些数据库的流量最终将在集群内路由到容器或服务IP。
网络性能也会变得很重要。如果你已经在网络的顶部层放置了软件定义的网络(SDN,如Nuage或Calico),则为Docker平台添加更多SDN(如OpenVSwitch或另一个Calico层)会明显降低性能。
容器还可能以你无法预期的方式影响网络。传统上,许多应用程序都使用稳定的源IP地址作为对外部服务进行身份验证的一部分。但是,在容器世界中,从容器提供的源IP既可以是容器IP,也可以是容器在其上运行的主机的IP(它将执行网络地址转换[NAT]返回到容器)。此外,如果它来自主机集群,则不能保证所提供的IP是稳定的。有多种方法可以确保IP表示的稳定性,但是通常需要一些设计和实现工作。
负载平衡是另一个可能需要大量精力的领域。这个主题涉及的内容太多,很可能成为另一本书的主题,但是这里给出一个简短的问题清单。
- 哪种产品是首选/标准的(如Nginx、F5、HAProxy或HTTPD)?
- 你将如何以及在何处处理SSL终止?
- 是否需要双向身份验证TLS解决方案?
- 如何在你的平台上生成和管理证书?
- 你的负载均衡器是否以与其他业务一致的方式影响HTTP头(如果没有,请准备在此处进行大量调试)?
最后,如果除已经拥有或使用的任何数据中心之外,你还使用云提供方,则可能需要考虑用户是否以及如何通过云提供方重新连接到本地服务。
4.日志记录
几乎每个应用程序都有与之关联的日志文件。大多数应用程序都希望以一种持久的方式(尤其是在生产环境中)访问那些日志,因此通常需要某种集中式日志记录服务。由于容器是短暂的(这通常不包含虚拟机和专用服务器),因此如果容器死亡并且日志存储在其文件系统中,则此类日志记录数据可能会丢失。由于这些原因,迁移容器世界可能使日志记录挑战更加突出。
因为日志记录是应用程序功能的核心和通用部分,所以对其进行集中和标准化通常是有意义的。容器可以提供此机会。
5.监控
大多数应用将或多或少地需要受到监控,并且与容器监控有关的供应商和产品琳琅满目。这仍然是一个新兴领域。
Prometheus是在Docker领域具有广泛吸引力的一种产品。它最初是由SoundCloud开发的,随着时间的流逝,尤其是自从成为云原生计算基金会的一部分以来,其受欢迎程度不断提高。
由于容器与虚拟机或物理机不同,因此传统的监视工具如果不能识别容器就不一定能在容器内(作为边车)或主机上很好地工作。
话虽如此,如果你正在运行主机集群并需要维护它们,那么传统的、已建立的、成熟的监控工具将派上用场。在你尝试将最终用户的集群中的最大性能发挥到极致时,可能会严重依赖监控工具。这是基于平台成功的假设。我们的经验表明,需求经常远远超过供应。